package lu.med.praxiswahl.wahlumed.client.oprechnungen;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import lu.med.praxiswahl.wahlumed.client.rechnungen.RechnungenTableModel;
import lu.med.praxiswahl.wahlumed.client.tarif.TarifTableModel;
import lu.med.praxiswahl.wahlumed.client.utilities.Parser;
import lu.med.praxiswahl.wahlumed.client.utilities.PrintConfiguration;
import lu.med.praxiswahl.wahlumed.client.utilities.UniCode;
import lu.med.praxiswahl.wahlumed.client.wclient.Main;
import lu.med.praxiswahl.wahlumed.client.wclient.PatientenSuchmaske;
import lu.med.praxiswahl.wahlumed.client.wclient.PatientenSuchmaskeListener;


@SuppressWarnings("serial")
public class OPRechnungenUnterPanelKlasseZwei extends JPanel implements
	PatientenSuchmaskeListener, ActionListener, ListSelectionListener,
	Printable, FocusListener
{
    private boolean saved = true;
    private Main dataManager;
    private int tarifMode;
    private DefaultListModel mo;
    private OPRechnungenDatasetKlasseZwei model; // Enth�lt die aktuell zu
    // bearbeitende Rechnung
    private JCheckBox checkUnbezahlt, checkBezahlt, checkZugeschickt,
	    checkImPC, checkNichtErstellt, cch, checkUeberweisung;
    private JCheckBox cf, cg;
    private JTextField zwischensumme, endsumme, zwischensummeSchw, anzahlung,
	    apayer, datum2;
    private JTextField datum, besonderheiten;
    private JList list;
    private JLabel matLabel;
    private JRadioButton modusAktuell, modusBezahlt, modusNichtErstellt;
    private JComboBox moneyOption;
    private OPRechnungenTableKlasseZwei t1;
    private OPRechnungenTableModelKlasseZwei m1;
    private JTextArea notesTextArea;
    @SuppressWarnings("unused")
    private boolean newRechnung = true; // Wenn eine Rechnung neu erstellt
    // wird, so wird dieses Flag auf true gesetzt, damit die Rechnung den
    // bestehenden hinzugefügt wird. Lädt man eine bestehende wird es auf
    // false gesetzt
    @SuppressWarnings("unused")
    private boolean loadNichtErstellteRechnung = false;
    // Wird true, wenn man eine nicht erstellte Rechnung zur Bearbeitung
    // geladen hat. Wird bei jener das NIcht erstellt Haekchen entfernt, so
    // muss diese naemlich auf dem Server transferiert werden
    // private ArrayList<RechnungenDataset> lu.med.praxiswahl.wahlumed.client.rechnungen = new
    // ArrayList<RechnungenDataset>();
    private TarifTableModel tarifModel;
    private ArrayList<Long> rechnungenIDs = new ArrayList<Long>();
    // Immer wenn eine Kategorie abgefragt wird, so werden einfach
    // nur die entsprechenden IDs ermittelt und in diese Liste eingetragen
    // Die eigentlichen Daten werden erst mit einer Auswahl aus der Liste
    // geladen
    private String matricule = "";

    public OPRechnungenUnterPanelKlasseZwei(Main dataManager,
	    PatientenSuchmaske search)
    {
	// Das Panel ist ähnlich dem Ordonancen Panel aufgebaut
	// Oben ist eine Button Leiste mit schnell verfügbaren Funktionen
	// Auf der rechten Seite ist das Suchpanel mit den aktuell gesuchten
	// Patienten und links daneben eine Liste mit allen aktuell verfügbaren
	// Rechnungen, dargestellt in Form des Rechnungsdatums
	// Links daneben ist das eigentliche Hauptpanel, dass die beiden
	// Rechnungstabellen im Mittelteil enthaelt, oben drueber die
	// Bearbeitungs
	// Optionen und unten drunter die Bezahloptionen
	super(new BorderLayout());
	this.dataManager = dataManager;

	tarifModel = new TarifTableModel(dataManager);
	tarifModel.transferFromDatabase();

	JPanel leftPanel, rightPanel, leftOptionsPanel, leftPaymentPanel, leftTablePanel;
	JPanel overall = new JPanel(new BorderLayout());

	search.addSuchmaskeListener(this);

	// Button Leiste mit Funktionsbuttons
	JPanel buttonPanel = new JPanel(new GridLayout(1, 0));
	JButton a, b, c, d, e, f, g;

	a = new JButton("Aktuell");
	b = new JButton("Bezahlt");
	c = new JButton("Nicht erstellt");
	d = new JButton("Drucken");
	e = new JButton("Speichern");
	f = new JButton("Code Tarif");
	g = new JButton("L" + UniCode.getoe() + "schen");

	a.addActionListener(this);
	b.addActionListener(this);
	c.addActionListener(this);
	d.addActionListener(this);
	e.addActionListener(this);
	f.addActionListener(this);
	g.addActionListener(this);

	buttonPanel.add(a);
	buttonPanel.add(b);
	buttonPanel.add(c);
	buttonPanel.add(d);
	buttonPanel.add(e);
	buttonPanel.add(f);
	buttonPanel.add(g);

	// Linke Seite mit Eingabebereich // ben�tigt oben
	// noch den �blichen Adressbereich
	leftPanel = new JPanel(new BorderLayout());
	leftPanel.setBorder(BorderFactory.createTitledBorder("Eingabemaske"));

	JPanel leftOptionsPanelOverall = new JPanel(new BorderLayout());

	JPanel leftOptionsPanel1 = new JPanel(new GridLayout(0, 6));

	checkUnbezahlt = new JCheckBox("Unbezahlt");
	checkBezahlt = new JCheckBox("Bezahlt");
	checkZugeschickt = new JCheckBox("Zugeschickt");
	checkImPC = new JCheckBox("Im PC");
	checkNichtErstellt = new JCheckBox("Nicht erstellt");
	checkUeberweisung = new JCheckBox("R" + UniCode.getue() + "ck"
		+ UniCode.getue() + "berweisung");

	datum = new JTextField();
	datum.setHorizontalAlignment(JTextField.RIGHT);
	JPanel datumPanel = new JPanel(new GridLayout(0, 2));
	datumPanel.add(new JLabel("Datum:"), BorderLayout.WEST);
	datumPanel.add(datum, BorderLayout.EAST);
	datum.setPreferredSize(new Dimension(100, 0));

	datum2 = new JTextField();
	datum2.setHorizontalAlignment(JTextField.RIGHT);
	JPanel datumPanel2 = new JPanel(new GridLayout(0, 2));
	datumPanel2.add(new JLabel("Dat.der R" + UniCode.getue() + "ck.:"),
		BorderLayout.WEST);
	datumPanel2.add(datum2, BorderLayout.EAST);
	datum2.setPreferredSize(new Dimension(100, 0));

	besonderheiten = new JTextField();
	besonderheiten.setHorizontalAlignment(JTextField.LEFT);
	JPanel besonderheitenPanel = new JPanel(new GridLayout(0, 2));
	JLabel besonderheitenLabel = new JLabel("Besonderheiten:");
	besonderheitenLabel.setHorizontalAlignment(JTextField.RIGHT);
	besonderheitenPanel.add(besonderheitenLabel, BorderLayout.WEST);
	besonderheitenPanel.add(besonderheiten, BorderLayout.EAST);
	besonderheiten.setPreferredSize(new Dimension(100, 25));

	leftOptionsPanel1.add(datumPanel);
	leftOptionsPanel1.add(checkBezahlt);
	leftOptionsPanel1.add(checkUnbezahlt);
	leftOptionsPanel1.add(checkImPC);
	leftOptionsPanel1.add(checkZugeschickt);
	leftOptionsPanel1.add(checkNichtErstellt);
	leftOptionsPanel1.add(datumPanel2);
	leftOptionsPanel1.add(checkUeberweisung);
	leftOptionsPanel1.add(new JLabel(""));
	leftOptionsPanel1.add(new JLabel(""));
	leftOptionsPanel1.add(new JLabel(""));
	leftOptionsPanel1.add(new JLabel(""));

	matLabel = new JLabel("Matricule : ");

	JPanel leftOptionsPanel2 = new JPanel(new GridLayout(0, 2));

	leftOptionsPanel2.add(matLabel);

	leftOptionsPanel2.add(besonderheitenPanel);

	leftOptionsPanelOverall.add(leftOptionsPanel1, BorderLayout.CENTER);
	leftOptionsPanelOverall.add(leftOptionsPanel2, BorderLayout.SOUTH);

	// JPanel leftOptionsPanel2 = new JPanel(new BorderLayout());
	// leftOptionsPanel2.add(datumPanel,BorderLayout.WEST);
	// leftOptionsPanel2.add(leftOptionsPanel,BorderLayout.CENTER);

	leftPanel.add(leftOptionsPanelOverall, BorderLayout.NORTH);

	leftPaymentPanel = new JPanel(new GridLayout(1, 0));

	cf = new JCheckBox("Cash");
	cg = new JCheckBox("Karte");
	cch = new JCheckBox("" + UniCode.getUE() + "berweisung");

	leftPaymentPanel.add(cch);
	leftPaymentPanel.add(cf);
	leftPaymentPanel.add(cg);

	JPanel leftPaymentOptionsPanel = new JPanel(new BorderLayout());
	Vector<String> paymentOptions = new Vector<String>();
	paymentOptions.add("");
	paymentOptions.add("V PAY");
	paymentOptions.add("Visa");
	paymentOptions.add("Mastercard");
	paymentOptions.add("Maestro");
	moneyOption = new JComboBox(paymentOptions);
	moneyOption.setEditable(true);
	leftPaymentOptionsPanel.add(moneyOption, BorderLayout.CENTER);

	leftPaymentPanel.add(leftPaymentOptionsPanel);

	leftPaymentPanel.setBorder(BorderFactory
		.createTitledBorder("Zahlungsoptionen"));

	leftPanel.add(leftPaymentPanel, BorderLayout.SOUTH);

	leftTablePanel = new JPanel(new BorderLayout());
	tarifMode = -1;
	if (!matricule.equals(""))
	{
	    // Es ist bereits ein Patient ausgew�hlt
	    // Beginnt die Versicherungsnummer mit einer Zahl, so
	    // wird der A Tarif verwendet, sonst der B Tarif
	    char zahl = matricule.charAt(0);
	    if ((zahl == '1') || (zahl == '2') || (zahl == '3')
		    || (zahl == '4') || (zahl == '5') || (zahl == '6')
		    || (zahl == '7') || (zahl == '8') || (zahl == '9')
		    || (zahl == '0'))
	    {
		tarifMode = RechnungenTableModel.TARIF_A;
	    }
	    else
	    {
		tarifMode = RechnungenTableModel.TARIF_B;
	    }
	}
	m1 = new OPRechnungenTableModelKlasseZwei(
		RechnungenTableModel.MODE_TABLE_ONE, dataManager, model, this,
		tarifMode, tarifModel);
	t1 = new OPRechnungenTableKlasseZwei(m1);
	JScrollPane sp1;
	sp1 = new JScrollPane(t1);

	JPanel psp1 = new JPanel(new BorderLayout());

	notesTextArea = new JTextArea();

	JPanel psp2 = new JPanel(new BorderLayout());
	psp1.add(sp1, BorderLayout.CENTER);
	zwischensumme = new JTextField("");
	JPanel psp11, psp12;
	psp11 = new JPanel(new BorderLayout());
	psp12 = new JPanel(new GridLayout(0, 2));
	psp12.add(new JLabel("SOUS-TOTAL:"));
	psp12.add(zwischensumme);
	psp11.add(psp12, BorderLayout.EAST);
	psp1.add(psp11, BorderLayout.SOUTH);

	endsumme = new JTextField("");
	zwischensummeSchw = new JTextField("");
	anzahlung = new JTextField("");
	apayer = new JTextField("");
	JPanel psp21, psp22;
	psp21 = new JPanel(new BorderLayout());
	psp22 = new JPanel(new GridLayout(0, 8));
	psp22.add(new JLabel("SOUS-TOTAL:"));
	psp22.add(endsumme);
	psp22.add(new JLabel("  REPORT/TOTAL:"));
	psp22.add(zwischensummeSchw);
	psp22.add(new JLabel("ACOMPTE A DEDUIRE:"));
	psp22.add(anzahlung);
	psp22.add(new JLabel("A PAYER:"));
	psp22.add(apayer);
	psp21.add(psp22, BorderLayout.EAST);
	psp2.add(psp21, BorderLayout.SOUTH);

	JPanel tableOverallPanel = new JPanel(new GridLayout(2, 0));
	tableOverallPanel.add(psp1);
	tableOverallPanel.add(psp2);

	leftTablePanel.add(tableOverallPanel, BorderLayout.CENTER);
	JScrollPane notesJSP = new JScrollPane(notesTextArea);
	notesJSP.setPreferredSize(new Dimension(0, 50));
	leftTablePanel.add(notesJSP, BorderLayout.SOUTH);

	leftPanel.add(leftTablePanel, BorderLayout.CENTER);

	// Rechte Seite mit der Liste verfügbarer Rechnungen
	JPanel modePanel = new JPanel(new GridLayout(0, 1));
	this.modusAktuell = new JRadioButton("Aktuell");
	modusAktuell.addActionListener(new TypeActionListenerZwei(this));
	this.modusBezahlt = new JRadioButton("Erledigt");
	modusBezahlt.addActionListener(new TypeActionListenerZwei(this));
	this.modusNichtErstellt = new JRadioButton("Nicht erstellt");
	modusNichtErstellt.addActionListener(new TypeActionListenerZwei(this));
	modePanel.add(modusAktuell);
	modePanel.add(modusBezahlt);
	modePanel.add(modusNichtErstellt);
	ButtonGroup mbg = new ButtonGroup();
	mbg.add(modusAktuell);
	mbg.add(modusBezahlt);
	mbg.add(modusNichtErstellt);

	rightPanel = new JPanel(new BorderLayout());
	rightPanel.setBorder(BorderFactory.createTitledBorder("Verf"
		+ UniCode.getue() + "gbare Rechnungen"));
	mo = new DefaultListModel();
	refreshMo();
	list = new JList(mo);
	list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	list.addListSelectionListener(this);
	JScrollPane ssp = new JScrollPane(list);
	rightPanel.add(ssp, BorderLayout.CENTER);
	rightPanel.add(modePanel, BorderLayout.NORTH);
	rightPanel.setPreferredSize(new Dimension(150, 0));

	overall.add(rightPanel, BorderLayout.EAST);
	overall.add(buttonPanel, BorderLayout.NORTH);
	overall.add(leftPanel, BorderLayout.CENTER);

	this.add(search, BorderLayout.EAST);
	this.add(overall, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
	if (e.getActionCommand().equals("Code Tarif"))
	{
	    TarifTableModel tarif = new TarifTableModel(dataManager);
	    tarif.transferFromDatabase();
	    m1.updateTarif(tarif, tarifMode);
	    new OPRechnungenTarifauswahlKlasseZwei(this, dataManager, tarif);
	    this.setSumme();

	}
	if (e.getActionCommand().equals("Drucken"))
	{
	    // Es muss ein Patient ausgew�hlt sein, damit gedruckt
	    // werden kann
	    if (model == null)
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue() + "ssen eine Patientin ausw"
			+ UniCode.getae() + "hlen, um drucken zu k"
			+ UniCode.getoe() + "nnen.");
		return;
	    }
	    // ALs erstes Ausgabe des Drucker Dialogs
	    PrinterJob pj = PrinterJob.getPrinterJob();
	    boolean ret = pj.printDialog();
	    if (ret)
	    {
		pj.setPrintable(this);
		try
		{
		    pj.setJobName("HonorarDruck");
		    // pj.setCopies(1);
		    pj.print();
		}
		catch (PrinterException p)
		{
		    JOptionPane.showMessageDialog(dataManager,
			    "Es trat ein Fehler beim Drucken auf.");
		}
	    }
	}

	if (e.getActionCommand().equals("Nicht erstellt"))
	{
	    // Das Button Nicht erstellt wurde gedrueckt,
	    // Die Daten der Eingabemaske werden entsprechend gesetzt
	    // Es muss ein Patient ausgewaehlt sein
	    if (matricule.equals(""))
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue() + "ssen zuerst eine Patientin ausw"
			+ UniCode.getae() + "hlen");
		return;
	    }

	    if (!saved)
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue()
			+ "ssen die aktuelle Rechnung zuerst speichern");
		return;
	    }
	    saved = false;

	    // Erzeugt eine neue nicht erstellte Rechnung in der Datenbank
	    long nr = dataManager.getOPHonorarKlasseZweiContext()
		    .getSubPrimaryKeyIndex() + 1; // Nummer
	    // Zu der Nummer muuss das Datum hinzugefügt werden
	    Calendar c = new GregorianCalendar();
	    if (nr == 0)
	    {
		// ID als Datum * 10.000
		nr = c.get(GregorianCalendar.YEAR) * 10000;
	    }
	    dataManager.getOPHonorarKlasseZweiContext()
		    .create_NICHTERSTELLTE_Bill(nr, false, false, matricule, c);

	    // Erstellt das Model und füllt es entsprechend mit den Daten
	    // der Rechnung
	    model = new OPRechnungenDatasetKlasseZwei(dataManager);
	    model.setID(nr);
	    model.transferFromDatabase();
	    newRechnung = true;
	    loadNichtErstellteRechnung = false;
	    // Eingabemaske leeren
	    checkUnbezahlt.setSelected(false); // Unbezahlt
	    checkBezahlt.setSelected(false); // Bezahlt
	    checkZugeschickt.setSelected(false); // Zugeschickt
	    checkImPC.setSelected(false); // Im PC
	    checkNichtErstellt.setSelected(true); // Nicht erstellt
	    // Fügt das aktuelle Datum ein
	    GregorianCalendar gc = new GregorianCalendar();
	    String date = "" + gc.get(GregorianCalendar.DAY_OF_MONTH);
	    date += "." + (gc.get(GregorianCalendar.MONTH) + 1);
	    date += "." + gc.get(GregorianCalendar.YEAR);
	    datum.setText(date);
	    model.setUnfallDate(gc);
	    model.setCheckNichtErstellt(true);
	    model.transferToDatabase();
	    // Überträgt das leere Modell an die Tabellen
	    m1.reloadModel(model);
	    JOptionPane.showMessageDialog(dataManager,
		    "Eine nicht erstellte Rechnung wurde im System abgelegt.");
	}
	if (e.getActionCommand().equals("Aktuell"))
	{
	    if (matricule.equals(""))
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue() + "ssen zuerst eine Patientin ausw"
			+ UniCode.getae() + "hlen");
		return;
	    }

	    if (!saved)
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue()
			+ "ssen die aktuelle Rechnung zuerst speichern");
		return;
	    }
	    saved = false;

	    long nr = dataManager.getOPHonorarKlasseZweiContext()
		    .getSubPrimaryKeyIndex() + 1; // Nummer
	    // Zu der Nummer muuss das Datum hinzugefügt werden
	    Calendar c = new GregorianCalendar();
	    if (nr == 0)
	    {
		// ID als Datum * 10.000
		nr = c.get(GregorianCalendar.YEAR) * 10000;
	    }
	    dataManager.getOPHonorarKlasseZweiContext().create_ACTUAL_Bill(nr,
		    matricule, true, false, c);
	    model = new OPRechnungenDatasetKlasseZwei(dataManager);
	    model.setID(nr);
	    model.transferFromDatabase();
	    newRechnung = true;
	    loadNichtErstellteRechnung = false;
	    // Eingabemaske leeren
	    checkUnbezahlt.setSelected(true); // Unbezahlt
	    checkBezahlt.setSelected(false); // Bezahlt
	    checkZugeschickt.setSelected(false); // Zugeschickt
	    checkImPC.setSelected(false); // Im PC
	    checkNichtErstellt.setSelected(false); // Nicht erstellt
	    // F�gt das aktuelle Datum ein
	    GregorianCalendar gc = new GregorianCalendar();
	    String date = "" + gc.get(GregorianCalendar.DAY_OF_MONTH);
	    date += "." + (gc.get(GregorianCalendar.MONTH) + 1);
	    date += "." + gc.get(GregorianCalendar.YEAR);
	    datum.setText(date);
	    model.setUnfallDate(gc);
	    model.setCheckUnbezahlt(true);
	    model.transferToDatabase();
	    model.transferFromDatabase();
	    // �bertr�gt das leere Modell an die Tabellen
	    m1.reloadModel(model);
	    JOptionPane.showMessageDialog(dataManager,
		    "Eine offene Rechnung wurde erstellt.");
	}
	if (e.getActionCommand().equals("L" + UniCode.getoe() + "schen"))
	{
	    if (model == null)
		return;

	    if ((!this.modusNichtErstellt.isSelected())
		    && (matricule.equals("")))
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue() + "ssen zuerst eine Patientin ausw"
			+ UniCode.getae() + "hlen");
		return;
	    }

	    if (JOptionPane.showConfirmDialog(dataManager,
		    "Wollen Sie die Rechnung wirklich aus der Datenbank l"
			    + UniCode.getoe() + "schen?", "Rechnung l"
			    + UniCode.getoe() + "schen",
		    JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION)
		return;

	    dataManager.getOPHonorarKlasseZweiContext().deleteBill(
		    model.getID());
	    this.clearEditArea();
	    this.refreshMo();
	    JOptionPane.showMessageDialog(dataManager, "Die Rechnung wurde gel"
		    + UniCode.getoe() + "scht");
	}
	if (e.getActionCommand().equals("Bezahlt"))
	{
	    if (matricule.equals(""))
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue() + "ssen zuerst eine Patientin ausw"
			+ UniCode.getae() + "hlen");
		return;
	    }

	    if (!saved)
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue()
			+ "ssen die aktuelle Rechnung zuerst speichern");
		return;
	    }
	    saved = false;

	    long nr = dataManager.getOPHonorarKlasseZweiContext()
		    .getSubPrimaryKeyIndex() + 1; // Nummer
	    // Zu der Nummer muuss das Datum hinzugefügt werden
	    Calendar c = new GregorianCalendar();
	    if (nr == 0)
	    {
		// ID als Datum * 10.000
		nr = c.get(GregorianCalendar.YEAR) * 10000;
	    }
	    dataManager.getOPHonorarKlasseZweiContext().create_PAYED_Bill(nr,
		    matricule, true, true, c);

	    model = new OPRechnungenDatasetKlasseZwei(dataManager);
	    model.setID(nr);
	    model.transferFromDatabase();
	    newRechnung = true;
	    loadNichtErstellteRechnung = false;
	    // Eingabemaske leeren
	    checkUnbezahlt.setSelected(false); // Unbezahlt
	    checkBezahlt.setSelected(true); // Bezahlt
	    checkZugeschickt.setSelected(false); // Zugeschickt
	    checkImPC.setSelected(false); // Im PC
	    checkNichtErstellt.setSelected(false); // Nicht erstellt
	    // F�gt das aktuelle Datum ein
	    GregorianCalendar gc = new GregorianCalendar();
	    String date = "" + gc.get(GregorianCalendar.DAY_OF_MONTH);
	    date += "." + (gc.get(GregorianCalendar.MONTH) + 1);
	    date += "." + gc.get(GregorianCalendar.YEAR);
	    datum.setText(date);
	    model.setUnfallDate(gc);
	    model.setCheckBezahlt(true);
	    model.transferToDatabase();
	    // �bertr�gt das leere Modell an die Tabellen
	    m1.reloadModel(model);
	    JOptionPane.showMessageDialog(dataManager,
		    "Eine abgeschlossene Rechnung wurde erstellt.");
	}
	if (e.getActionCommand().equals("Drucken"))
	{
	    if (matricule.equals(""))
	    {
		JOptionPane.showMessageDialog(dataManager, "Sie m"
			+ UniCode.getue() + "ssen zuerst eine Patientin ausw"
			+ UniCode.getae() + "hlen");
		return;
	    }
	}
	if (e.getActionCommand().equals("Speichern"))
	{
	    // Überprüft, ob eine Speicherung möglich ist.
	    if (checkUnbezahlt.isSelected())
	    {
		if (checkBezahlt.isSelected())
		{
		    JOptionPane
			    .showMessageDialog(dataManager,
				    "Eine Rechnung kann nicht Bezahlt UND unbezahlt sein.");
		    return;
		}
	    }
	    else if (checkNichtErstellt.isSelected())
	    {
		if (checkUnbezahlt.isSelected() || checkBezahlt.isSelected())
		{
		    JOptionPane.showMessageDialog(dataManager,
			    "Entfernen Sie den Nicht Erstellt Haken, um speichern zu k"
				    + UniCode.getoe() + "nnen.");
		    return;
		}
	    }
	    saved = true;
	    // Überträgt die Text Felder ins Modell
	    if (zwischensumme.getText().equals(""))
	    {
		model.setZwischensumme(0.0d);
	    }
	    else
	    {
		model.setZwischensumme(Double.parseDouble(zwischensumme
			.getText()));
	    }
	    if (endsumme.getText().equals(""))
	    {
		model.setZwischensummeSchwanger(0.0d);
	    }
	    else
	    {
		model.setZwischensummeSchwanger(Double.parseDouble(endsumme
			.getText()));
	    }
	    if (zwischensummeSchw.getText().equals(""))
	    {
		model.setGesamtsumme(0.0d);
	    }
	    else
	    {
		model.setGesamtsumme(Double.parseDouble(zwischensummeSchw
			.getText()));
	    }
	    if (anzahlung.getText().equals(""))
	    {
		model.setAnzahlung(0.0d);
	    }
	    else
	    {
		model.setAnzahlung(Double.parseDouble(anzahlung.getText()));
	    }
	    if (apayer.getText().equals(""))
	    {
		model.setApayer(0.0d);
	    }
	    else
	    {
		model.setApayer(Double.parseDouble(apayer.getText())); // Überträgt
		// die
		// Check
		// Boxes
		// ins
		// Modell
	    }
	    Calendar c = new GregorianCalendar();
	    String cc[] = Parser.parseString(datum.getText(), '.');
	    int ccd;
	    try
	    {
		ccd = Integer.parseInt(cc[0]);
		c.set(GregorianCalendar.DAY_OF_MONTH, ccd);
		ccd = Integer.parseInt(cc[1]);
		c.set(GregorianCalendar.MONTH, ccd);
		ccd = Integer.parseInt(cc[2]);
		c.set(GregorianCalendar.YEAR, ccd);
	    }
	    catch (NumberFormatException enf)
	    {
	    }
	    model.setUnfallDatum(c);
	    model.setNotizen(this.notesTextArea.getText());
	    model.setCheckUnbezahlt(checkUnbezahlt.isSelected());
	    model.setCheckBezahlt(checkBezahlt.isSelected());
	    model.setCheckZugeschickt(checkZugeschickt.isSelected());
	    model.setCheckImDossier(checkImPC.isSelected());
	    model.setCheckNichtErstellt(checkNichtErstellt.isSelected());
	    model.setBezahltMitBar(cf.isSelected());
	    model.setCheckRueckueberweisung(checkUeberweisung.isSelected());
	    model.setRueckueberweisung(datum2.getText());

	    model.setBezahltMitBankomat(cch.isSelected());
	    model.setBezahltMitBar(cf.isSelected());
	    model.setBezahltMitKarte(cg.isSelected());
	    model.setBezahltMitKarte(cg.isSelected());
	    if (moneyOption.getSelectedIndex() != -1)
		model.setKartenTyp(moneyOption.getItemAt(
			moneyOption.getSelectedIndex()).toString());
	    else
		model.setKartenTyp("");
	    model.setBesonderheiten(besonderheiten.getText());
	    model.transferToDatabase();

	    refreshMo();
	    this.clearEditArea();
	    JOptionPane.showMessageDialog(dataManager,
		    "Die Rechnung wurde gespeichert.");

	}

    }

    public void addCode(String key)
    {
	// Fuegt einen Eintrag mit dem Code key den Tabellen hinzu
	if (m1 == null)
	{
	    return;
	}
	if (m1.freeSpace())
	{
	    // In die erste Tabelle eintragen
	    m1.addCode(key);
	}
	else
	{
	    return;
	}
    }

    public void clearEditArea()
    {
	checkUnbezahlt.setSelected(false); // Unbezahlt
	checkBezahlt.setSelected(false); // Bezahlt
	checkZugeschickt.setSelected(false); // Zugeschickt
	checkImPC.setSelected(false); // Im PC
	checkNichtErstellt.setSelected(false); // Nicht erstellt
	// F�gt das aktuelle Datum ein
	GregorianCalendar gc = new GregorianCalendar();
	String date = "" + gc.get(GregorianCalendar.DAY_OF_MONTH);
	date += "." + (gc.get(GregorianCalendar.MONTH) + 1);
	date += "." + gc.get(GregorianCalendar.YEAR);
	datum.setText(date);
	datum2.setText("");
	model = new OPRechnungenDatasetKlasseZwei(dataManager);
	m1.reloadModel(model);
	cf.setSelected(false);
	cg.setSelected(false);
	zwischensumme.setText("");
	endsumme.setText("");
	zwischensummeSchw.setText("");
	anzahlung.setText("");
	anzahlung.addFocusListener(this);
	apayer.setText("");
	besonderheiten.setText("");
	cf.setSelected(false);
	cg.setSelected(false);
	cch.setSelected(false);
	checkUeberweisung.setSelected(false);
	moneyOption.setSelectedItem("");
	this.datum2.setText("");
	this.matLabel.setText("Matricule: ");
	this.notesTextArea.setText("");
    }

    public void focusGained(FocusEvent e)
    {
    }

    public void focusLost(FocusEvent e)
    {
	m1.updateSumme();
	this.setSumme();
    }

    private String formatNumber(String nr)
    {
	int index = nr.indexOf(".");
	if (index == -1)
	    return nr + ".00";
	if (index == nr.length() - 2)
	{
	    return nr + "0";
	}
	return nr;
    }

    public void modelChanged(String matricule)
    {
	this.matricule = matricule;

	this.clearEditArea();
	model.clear();

	int tarifMode = -1;
	if (!matricule.equals(""))
	{
	    // Es ist bereits ein Patient ausgew�hlt
	    // Beginnt die Versicherungsnummer mit einer Zahl, so
	    // wird der A Tarif verwendet, sonst der B Tarif
	    char zahl = matricule.charAt(0);
	    if ((zahl == '1') || (zahl == '2') || (zahl == '3')
		    || (zahl == '4') || (zahl == '5') || (zahl == '6')
		    || (zahl == '7') || (zahl == '8') || (zahl == '9')
		    || (zahl == '0'))
	    {
		tarifMode = RechnungenTableModel.TARIF_A;
	    }
	    else
	    {
		tarifMode = RechnungenTableModel.TARIF_B;
	    }
	}
	m1.updateTarif(tarifModel, tarifMode);
	// Löscht alle Eingaben, so dass nicht eine bearbeitete
	// Rechnung fälschicherweise bei der falschen Patientin
	// gespeichert werden kann
	clearEditArea();
	refreshMo();
    }

    @Override
    public int print(Graphics g, PageFormat pageFormat, int pageIndex)
    {
	PrintConfiguration pc = new PrintConfiguration(
		Main.PRINT_CONFIGURATION_PATH, "oprechnung");
	// Es wurde drucken ausgew�hlt 3 = 1 mm
	if (pageIndex >= 1)
	{
	    return Printable.NO_SUCH_PAGE;
	}
	g.setFont(new Font("Times New Roman", Font.BOLD, 12));
	g.setColor(new Color(0, 0, 0));

	// Drucken von Matricule und Name
	g.drawString(matricule, pc.getCoordsFor("MATRICULE_X"), pc
		.getCoordsFor("MATRICULE_Y")); // Matricule
	dataManager.getCustomerContext().getCustomer(matricule);
	String nn = ""
		+ dataManager.getCustomerContext().getNachname(matricule)[0]
		+ " "
		+ dataManager.getCustomerContext().getNachname(matricule)[1]
		+ dataManager.getCustomerContext().getNachname(matricule)[2];
	g.drawString(nn, pc.getCoordsFor("NACHNAME_X"), pc
		.getCoordsFor("NACHNAME_Y")); // Nachname
	g.drawString(dataManager.getCustomerContext().getVorname(matricule), pc
		.getCoordsFor("VORNAME_X"), pc.getCoordsFor("VORNAME_Y")); // Name
	String[] nn2 = dataManager.getCustomerContext().getNachnameEhemann(
		matricule);
	if (nn2[0] != null)
	    if (!nn2[0].equals(""))
		if (!nn2[0].equals("-"))
		    g.drawString("Epoux: " + nn2[0].substring(3) + " " + nn2[1]
			    + " " + nn2[2], pc
			    .getCoordsFor("NACHNAME_EHEMANN_X"), pc
			    .getCoordsFor("NACHNAME_EHEMANN_Y"));

	// Drucken der Adresse
	g.drawString(dataManager.getCustomerContext().getPrivatAnschrift(
		matricule), pc.getCoordsFor("ADRESSE_X"), pc
		.getCoordsFor("ADRESSE_Y"));
	g
		.drawString(dataManager.getCustomerContext().getPrivatPLZ(
			matricule), pc.getCoordsFor("ADRESSE_X"), pc
			.getCoordsFor("ADRESSE_Y") + 16);
	// Druckt das Datum
	// g.drawString(datum.getText(), pc.getCoordsFor("DATUM_X"),
	// pc.getCoordsFor("DATUM_Y"));

	// Druckt die Tabellen zeilenweise
	int curPos = pc.getCoordsFor("TABELLE_EINS_START_Y");

	if (true)
	{
	    curPos = pc
		    .getCoordsFor("TABELLE_EINS_START_Y_FALLS_NICHT_SCHWANGER");
	}
	String[][] t = model.getDataRow();
	for (int row = 0; row < 10; row++)
	{
	    for (int col = 0; col < 7; col++)
	    {
		if (!t[row][4].equals("0"))
		    switch (col)
		    {
		    case 0:
			g.drawString(t[row][col], pc
				.getCoordsFor("SPALTE_1_POS_X"), curPos);
			break;
		    case 1:
			g.drawString(t[row][col], pc
				.getCoordsFor("SPALTE_2_POS_X"), curPos);
			break;
		    case 2:
			if (t[row][col].equals("\""))
			{
			    g.drawString("     " + t[row][col], pc
				    .getCoordsFor("SPALTE_3_POS_X"), curPos);
			}
			else
			    g.drawString(t[row][col], pc
				    .getCoordsFor("SPALTE_3_POS_X"), curPos);
			break;
		    case 3:
			g.drawString(t[row][col], pc
				.getCoordsFor("SPALTE_4_POS_X"), curPos);
			break;
		    case 4:
			g.drawString(t[row][col], pc
				.getCoordsFor("SPALTE_5_POS_X"), curPos);
			break;
		    case 5:
			if (!t[row][col].equals(""))
			    g.drawString(formatNumber(t[row][col])
				    + UniCode.getEuro(), pc
				    .getCoordsFor("SPALTE_6_POS_X"), curPos);
			break;
		    case 6:
			g.drawString(t[row][col], pc
				.getCoordsFor("SPALTE_7_POS_X"), curPos);
			break;
		    }
	    }
	    curPos += pc.getCoordsFor("ZEILE_INCREMENT_Y");
	}

	// Druckt die zweite Tabelle nur, wenn sich in jener
	// Daten befinden
	curPos = pc.getCoordsFor("TABELLE_ZWEI_START_Y");
	if (false)
	{
	    // Druckt die Summen
	    String endbetrag = zwischensumme.getText();
	    g.drawString(formatNumber(endbetrag) + UniCode.getEuro(), pc
		    .getCoordsFor("SUMME_1_SCHWANGER_X"), pc
		    .getCoordsFor("SUMME_1_SCHWANGER_Y")); // SOUS TOTAL 1 , 160
	    // * 3, 172 * 3
	    endbetrag = endsumme.getText();
	    g.drawString(formatNumber(endbetrag) + UniCode.getEuro(), pc
		    .getCoordsFor("SUMME_2_SCHWANGER_X"), pc
		    .getCoordsFor("SUMME_2_SCHWANGER_Y")); // SOUS TOTAL 2
	    endbetrag = zwischensummeSchw.getText();
	    g.drawString(formatNumber(endbetrag) + UniCode.getEuro(), pc
		    .getCoordsFor("SUMME_3_SCHWANGER_X"), pc
		    .getCoordsFor("SUMME_3_SCHWANGER_Y"));
	    endbetrag = anzahlung.getText();
	    g.drawString(formatNumber(endbetrag) + UniCode.getEuro(), pc
		    .getCoordsFor("SUMME_4_SCHWANGER_X"), pc
		    .getCoordsFor("SUMME_4_SCHWANGER_Y"));
	    endbetrag = apayer.getText();
	    g.drawString(formatNumber(endbetrag) + UniCode.getEuro(), pc
		    .getCoordsFor("SUMME_5_SCHWANGER_X"), pc
		    .getCoordsFor("SUMME_5_SCHWANGER_Y"));

	    t = model.getDataExtraRow();

	    for (int row = 0; row < 10; row++)
	    {
		for (int col = 0; col < 7; col++)
		{
		    if (!t[row][4].equals("0"))
			switch (col)
			{
			case 0:
			    g.drawString(t[row][col], pc
				    .getCoordsFor("SPALTE_1_POS_X"), curPos);
			    break;
			case 1:
			    g.drawString(t[row][col], pc
				    .getCoordsFor("SPALTE_2_POS_X"), curPos);
			    break;
			case 2:
			    if (t[row][col].equals("\""))
			    {
				g
					.drawString(
						"     " + t[row][col],
						pc
							.getCoordsFor("SPALTE_3_POS_X"),
						curPos);
			    }
			    else
				g
					.drawString(
						t[row][col],
						pc
							.getCoordsFor("SPALTE_3_POS_X"),
						curPos);
			    break;
			case 3:
			    g.drawString(t[row][col], pc
				    .getCoordsFor("SPALTE_4_POS_X"), curPos);
			    break;
			case 4:
			    g.drawString(t[row][col], pc
				    .getCoordsFor("SPALTE_5_POS_X"), curPos);
			    break;
			case 5:
			    if (!t[row][col].equals(""))
				g
					.drawString(
						formatNumber(t[row][col])
							+ UniCode.getEuro(),
						pc
							.getCoordsFor("SPALTE_6_POS_X"),
						curPos);
			    break;
			case 6:
			    g.drawString(t[row][col], pc
				    .getCoordsFor("SPALTE_7_POS_X"), curPos);
			    break;
			}
		}
		curPos += pc.getCoordsFor("ZEILE_INCREMENT_Y");
	    }
	}
	else
	{
	    // Druckt die Summen f�r die einfache Rechnung
	    String endbetrag = zwischensumme.getText();
	    g.drawString(formatNumber(endbetrag) + UniCode.getEuro(), pc
		    .getCoordsFor("SUMME_NICHT_SCHWANGER_X"), pc
		    .getCoordsFor("SUMME_NICHT_SCHWANGER_Y"));
	    // Anzahlung
	    if (Double.parseDouble(anzahlung.getText()) > 0)
	    {
		g.drawString(formatNumber(this.anzahlung.getText())
			+ UniCode.getEuro(), pc
			.getCoordsFor("SUMME_NICHT_SCHWANGER_X"), pc
			.getCoordsFor("SUMME_NICHT_SCHWANGER_Y") + 16);
		g.drawString(formatNumber(this.apayer.getText())
			+ UniCode.getEuro(), pc
			.getCoordsFor("SUMME_NICHT_SCHWANGER_X"), pc
			.getCoordsFor("SUMME_NICHT_SCHWANGER_Y") + 16 + 16);
	    }

	}
	return Printable.PAGE_EXISTS;
    }

    public void refreshListAktuell()
    {
	// Löscht die Liste mit den IDs
	mo.clear();
	rechnungenIDs.clear();
	// Fragt die Daten vom Server ab
	if (matricule.equals(""))
	{
	    return;
	    // Sucht nur Aktuelle Rechnungen für die passende Patientin
	}
	Calendar date = new GregorianCalendar();
	date.add(GregorianCalendar.YEAR, -2);
	Long[] aktIDs = dataManager.getOPHonorarKlasseZweiContext()
		.get_ACTUAL_BillsByCustomer(matricule);
	// Durchsucht die gefundenen Rechnungen nach solchen, die aktuell sind
	for (int i = 0; i < aktIDs.length; i++)
	{
	    dataManager.getOPHonorarKlasseZweiContext().getBill(aktIDs[i]);
	    // Ist die Rechnung aktuell
	    if (!dataManager.getOPHonorarKlasseZweiContext().isBezahlt())
	    {
		// Rechnung ist aktuell und wird der Liste hinzugefügt
		rechnungenIDs.add(aktIDs[i]);
		mo.addElement("(" + aktIDs[i] + ")");
	    }
	}
    }

    public void refreshListErledigt()
    {
	mo.clear();
	rechnungenIDs.clear();
	// Fragt die Daten vom Server ab
	if (matricule.equals(""))
	{
	    return;
	    // Sucht nur bezahlte Rechnungen für die passende Patientin
	}
	Calendar date = new GregorianCalendar();
	date.add(GregorianCalendar.YEAR, -2);
	Long[] aktIDs = dataManager.getOPHonorarKlasseZweiContext()
		.get_ERLEDIGTE_BillsByCustomer(matricule);
	// Durchsucht die gefundenen Rechnungen nach solchen, die aktuell sind
	for (int i = 0; i < aktIDs.length; i++)
	{
	    dataManager.getOPHonorarKlasseZweiContext().getBill(aktIDs[i]);
	    // Ist die Rechnung nicht mehr aktuell
	    if (dataManager.getOPHonorarKlasseZweiContext().isBezahlt())
	    {
		// Rechnung ist aktuell und wird der Liste hinzugefügt
		rechnungenIDs.add(aktIDs[i]);
		mo.addElement("(" + aktIDs[i] + ")");
	    }
	}
    }

    public void refreshListNichtErstellt()
    {
	// Erfragt eine Liste von nicht erstellten Rechnungen vom
	// Server und speichert diese in der ArrayList
	// Löscht die Daten Liste
	mo.clear();
	this.rechnungenIDs.clear();
	// Fragt die Daten vom Server ab
	Long[] neIDs = dataManager.getOPHonorarKlasseZweiContext()
		.getNichtErstellteRechnungen();
	// Geht die Liste durch und speichert die Rechnungsnummer in dem
	// List Modell ab. Diezugehörigen IDs werden in
	// nichtErstellteRechnungen gespeichert
	for (int i = 0; i < neIDs.length; i++)
	{
	    // Aktuelle Rechnung setzen
	    dataManager.getOPHonorarKlasseZweiContext().getBill(neIDs[i]);
	    // Datensatz erstellen
	    rechnungenIDs.add(neIDs[i]);
	    // RechnungsNummer auslesen und der Liste hinzufügen
	    mo.addElement("(" + neIDs[i] + ")");
	}
    }

    public void refreshMo()
    {
	// Wenn ein neuer Patient ausgewählt wird, dann
	// wird beim Server eine Liste mit den verfügbaren
	// Rechnungen abgefragt und in der Liste dargestellt
	// Dargestellt werden aber nur die Rechnungen gemäß dem
	// aktuellen Modus
	if (!matricule.equals(""))
	{
	    // Es wurde ein Patient ausgew�hlt. Daher werden dessen
	    // Rechnungen geladen
	    if (modusNichtErstellt.isSelected())
	    {
		refreshListNichtErstellt();
	    }
	    else if (modusAktuell.isSelected())
	    {
		refreshListAktuell();
	    }
	    else if (modusBezahlt.isSelected())
	    {
		refreshListErledigt();
	    }
	}
	else if (modusNichtErstellt.isSelected())
	{
	    // Nicht erstellte werden global verarbeitet, daf�r
	    // muss kein Patient ausgew�hlt sein
	    refreshListNichtErstellt();
	}
	clearEditArea();
    }

    public void setSumme()
    {
	// Falls bei der Anzahlung etwas steht, so wird der
	// Wert von value abgezogen
	double dd = 0.0;

	if (!anzahlung.getText().equals(""))
	{
	    // Es gibt eine Anzahlung, die abgezogen werden muss
	    try
	    {
		dd = Double.parseDouble(anzahlung.getText());
	    }
	    catch (NumberFormatException e)
	    {
		JOptionPane.showMessageDialog(dataManager,
			"NumberFormatException");
	    }
	}

	// zwischensumme = Summe erste Tabelle
	double zwischensumme_Value, zwischenSch_value;
	zwischensumme_Value = m1.getSumme();
	// zwischenSch = Summe erste Tabelle + Summe zweite Tabelle
	zwischenSch_value = m1.getSumme();
	// anzahlung
	// endsumme = Summe erste Tabelle + Summe zweite Tabelle - anzahlung
	double endsumme = zwischenSch_value - dd;
	DecimalFormat f = new DecimalFormat("#0.00");
	zwischensumme.setText(("" + f.format(zwischensumme_Value)).replaceAll(
		",", "."));
	zwischensummeSchw.setText(("" + f.format(zwischenSch_value).replaceAll(
		",", ".")));
	this.apayer.setText(("" + f.format(endsumme).replaceAll(",", ".")));
	model.setApayer(endsumme);
    }

    @Override
    public void valueChanged(ListSelectionEvent e)
    {
	// Eine der Rechnungen aus der Liste wurde angeklickt.
	// Es wird zwischen Nicht Erstellten und anderen Rechnungen
	// unterschieden
	if (list.getSelectedIndex() == -1)
	{
	    // Keine Eintr�ge in der Liste oder nichts makiert
	    return;
	}

	if (model == null)
	{
	    model = new OPRechnungenDatasetKlasseZwei(dataManager);
	    // Eine nicht erstellte Rechnung wurde angeklickt
	}
	if (list.getSelectedIndex() >= rechnungenIDs.size())
	{
	    return;
	}

	this.clearEditArea();

	model.setID(this.rechnungenIDs.get(list.getSelectedIndex()));
	model.clear();
	model.transferFromDatabase();
	m1.reloadModel(model);
	loadNichtErstellteRechnung = true;
	checkUnbezahlt.setSelected(model.getCheckUnbezahlt()); // Unbezahlt
	checkBezahlt.setSelected(model.getCheckBezahlt()); // Bezahlt
	checkZugeschickt.setSelected(model.getCheckZugeschickt()); // Zugeschickt
	checkImPC.setSelected(model.getCheckImDossier()); // Im PC
	checkNichtErstellt.setSelected(model.getCheckNichtErstellt()); // Nicht
	// erstellt

	cf.setSelected(model.getBezahltMitBar());
	cg.setSelected(model.getBezahltMitKarte());
	cch.setSelected(model.getBezahltMitBankomat());
	checkUeberweisung.setSelected(model.isCheckRueckueberweisung());

	datum2.setText(model.getRueckueberweisung());

	notesTextArea.setText(model.getNotizen());

	zwischensumme.setText("" + model.getZwischensumme());
	endsumme.setText("" + model.getZwischensummeSchwanger());
	zwischensummeSchw.setText("" + model.getGesamtsumme());
	anzahlung.setText("" + model.getAnzahlung());
	apayer.setText("" + model.getApayer());
	if (model.getUnfallDate() != null)
	{
	    int y, m, d;
	    y = model.getUnfallDate().get(GregorianCalendar.YEAR);
	    m = model.getUnfallDate().get(GregorianCalendar.MONTH) + 1;
	    d = model.getUnfallDate().get(GregorianCalendar.DAY_OF_MONTH);
	    String dd;
	    if (d < 10)
	    {
		dd = "0" + d;
	    }
	    else
	    {
		dd = "" + d;
	    }
	    String mm = "";
	    if (m < 10)
	    {
		mm = "0" + m;
	    }
	    else
	    {
		mm = "" + m;
	    }
	    datum.setText(dd + "." + mm + "." + y);
	}
	else
	{
	    datum.setText("");
	}
	besonderheiten.setText(model.getBesonderheiten());
	// berechnet die Summe und trägt sie ein
	this.setSumme();

	matLabel.setText("Matricule:" + model.getMatricule() + model.getName());
	moneyOption.setSelectedItem(model.getKartenTyp());
    }
}
